package com.zjj.fanshe.reflect.gen;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
 * @author zhoujunjie
 * @desc TODO
 * @date
 */
/**
 * 反射: “暴力破解”
 * 1.破坏封装性
 * 2.破坏泛型
 *
 * 需求：集合泛型为Integer，通过反射，将"abc"字符串添加至集合中
    已知：
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        list.add(30);
    输出结果：
        [10, 20, 30, abc]
 */
public class GenTest {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //泛型：当集合指定泛型的数据类型，在“编译期”约束添加进来的元素数据类型
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        list.add(30);
        //list.add("abc");
        System.out.println(list);   //[10, 20, 30]

        //反射：运行期的机制，破坏泛型
        //1.获取集合的类类型
        Class<List> clazz = List.class;
        //2.获取add()方法对象   第一个参数：方法名   第二个参数：方法形参的数据类型
        Method addMethod = clazz.getDeclaredMethod("add", Object.class);
        //3.通过反射执行方法     invoke(执行的对象 ,  传递的数据) 执行方法
        Object flag = addMethod.invoke(list, "abc");
        System.out.println("flag = " + flag);
        System.out.println(list);
    }

}
